"""
参考文档: https://docs.python.org/zh-cn/3/tutorial/controlflow.html#default-argument-values

关键字参数可以使用key = value的形式进行函数调用

"""

def parrot(voltage, stage='a stiff', action='voom', type='Norwegian Blue'):
    # 这个函数必须有一个参数voltage,三个可选参数

    message = "-- This parrot wouldn't" + action + ' '
    message += "if you put" + str(voltage) + "volts through it."
    message += "-- Lovely plumage, the" + type
    message += "-- It's" + stage + "!"

    return message

def testKeyWords():

    """
    通过关键字调用对应的函数

    函数调用的时候，关键字参数必须跟在位置参数后面，顺序不重要，不能对同一个关键字多次赋值

    当函数最后一个形参为**name, 表示接受一个字典{},这个dict包含与函数中对应已定义形参对应之外的所有参数
    *name 可以和**name组合使用，但是*name必须在**name前面
    *name接受一个元组tuple，该tuple包含形参列表以外的位置参数
    dict和tuple的细节可以参考如下示例


    """

    # 不使用关键字
    print("parrot(1000) is {}".format(parrot(1000)))

    # 通过关键字voltage调用函数
    print("parrot(voltage=1000) is {}".format(parrot(voltage=1000)))

    # 两个关键字，关键字参数的顺序可以不跟声明时一样
    print("parrot(voltage=200, stage='a manager') is {}".format(parrot(voltage=200, stage='a manager')))
    
    print("parrot(stage='a manager', voltage=200) is {}".format(parrot(stage='a manager', voltage=200)))

    # *name和**name一起使用的例子
    def cheeseShop(kind, *arguments, **keywords):
        print("Do you have any?", kind, "?")
        print("I am sorry, wr are all out of", kind)

        for val in arguments:
            print(val)
        # 输出--------
        print("-" * 40)
        for key in keywords:
            print(key, ": ", keywords[key])

    # 调用上述函数
    cheeseShop("potato", "It's very runny, sir.", "It's very very runny, sir.", shopKeeper="MR", client="AL")

    # 关键字参数在输出结果的顺序和调用函数的顺序一致

testKeyWords()

    
